home *** CD-ROM | disk | FTP | other *** search
/ Creative Computers / Creative Computers CD-ROM, Volume 1 (Legendary Design Technologies, Inc.)(1994).iso / shareware / fractals / apfelkiste / apfelkiste1.3 / source / apfelkiste1.3src.lzh / Apfelkiste.c < prev    next >
C/C++ Source or Header  |  1991-10-30  |  24KB  |  880 lines

  1. /************************************************************************/
  2. /* Apfel.c --- Generates an image of the Mandelbrot-set            */
  3. /*                                    */
  4. /* Author:    M. Böhnisch (BillySoft)                    */
  5. /*        Löher Str. 2                        */
  6. /*        D-4790 Paderborn                    */
  7. /*                                    */
  8. /*        billy@uni-paderborn.de.pbinfo                */
  9. /*======================================================================*/
  10. /* 06.11.89    iterative version with fixed box sizes (10 by 10),    */
  11. /*        adapted a GFA-BASIC program from a german magazine    */
  12. /*                                    */
  13. /* 08.11.89    complete own version with recursive algorithm        */
  14. /*        (divide & conquer)                    */
  15. /*                                    */
  16. /* 10.11.89    added user input of picture size and borders        */
  17. /*                                    */
  18. /* 11.11.89    minor bug fixing                    */
  19. /*                                    */
  20. /* 20.11.89    added fix-point arithmetik written in assembler        */
  21. /*        format:                            */
  22. /*                                    */
  23. /*            [sgn|xxx xxxx xxxx xxxx.xxxx xxxx xxxx xxxx]    */
  24. /*                                    */
  25. /*        not accurate enough.                    */
  26. /*                                    */
  27. /* 21.11.89    rewrote fix-point format to:                */
  28. /*                                    */
  29. /*            [sgn|xxx xxxx.xxxx xxxx xxxx xxxx xxxx xxxx]    */
  30. /*                                    */
  31. /*        nice! (I'll try to use 26 bit after the point sometime) */
  32. /*                                    */
  33. /* 28.11.89    found IFF-Library on Fish #173. save picture option    */
  34. /*        added.                            */
  35. /*                                    */
  36. /* 04.12.89    improved assembly program                */
  37. /*                                    */
  38. /* 07.12.89    slight optimization in recursion scheme            */
  39. /*                                    */
  40. /* 09.12.89    added input requester                    */
  41. /*                                    */
  42. /* 21.07.90    review for Aztek-C5.0a                    */
  43. /*                                    */
  44. /* 23.09.90    print option added (color printers)            */
  45. /*                                    */
  46. /* 25.09.90    added color requester                    */
  47. /*                                                                      */
  48. /* 27.09.90     optimization of assembly program                        */
  49. /*                                    */
  50. /* 15.11.90    review for Lattice-C5.10                */
  51. /*                                    */
  52. /* 19.11.90    added a little retrying in case of an error by closing    */
  53. /*        screens. Might recover some problems with Amigas short    */
  54. /*        on memory or when really *BIG* screens are requested.    */
  55. /*                                    */
  56. /* 25.11.90    added s'more source code comments and translated all    */
  57. /*        strings from german to english                */
  58. /*                                    */
  59. /* 30.01.91    removed a bug causing to save no colormap along with a    */
  60. /*        picture                            */
  61. /*                                    */
  62. /* 01.02.91    removed a bug making strange things while colorcycling    */
  63. /*        pictures with more than 5 BitPlanes            */
  64. /*                                    */
  65. /* 01.02.91    added configuration facilities                */
  66. /*                                    */
  67. /* 17.04.91    removed a bug preventing the "Multitasking OFF" to work    */
  68. /*                                    */
  69. /* 18.04.91    some cast - operators added in "printersupport.h" to    */
  70. /*        compile without warnings for Kick 2.0            */
  71. /*                                    */
  72. /* 08.05.91    added 68030/68881 support                */
  73. /*                                    */
  74. /* 09.05.91    replaced lattice fp by fast floating point functions    */
  75. /************************************************************************/
  76.  
  77. /* -------------------------------------------------------------------- */
  78. /* Some defininitions to take advantage of Lattice's LSR-code:        */
  79. /* -------------------------------------------------------------------- */
  80. long     _stack        = 20000;    /* Stack space for this task     */
  81. char    *_procname    = "Apfelkiste";    /* Name of process created    */
  82. long     _priority    = 0;        /* Process priority        */
  83. long     _BackgroundIO    = 0;        /* No stdio required        */
  84. /* -------------------------------------------------------------------- */
  85.  
  86. #define APFEL_VERSION    "27"
  87.  
  88. #include <exec/types.h>
  89. #include <exec/memory.h>
  90. #include <intuition/intuition.h>
  91. #include <graphics/gfx.h>
  92. #include <graphics/gfxmacros.h>
  93. #include <proto/exec.h>
  94. #include <proto/dos.h>
  95. #include <proto/graphics.h>
  96. #include <proto/intuition.h>
  97. #include <libraries/iff.h>
  98. #include <libraries/arpbase.h>
  99. #include <libraries/color.h>
  100. #include <printersupport.h>
  101. #include <clib/macros.h>
  102. #include <string.h>
  103. #include <stdlib.h>
  104. #include <stdio.h>
  105. #include <dos.h>
  106. #include <mffp.h>
  107. #include <math.h>
  108. #include "Apf0.h"
  109. #include "Apf1.h"
  110. #include "Apf2.h"
  111.  
  112. /* -------------------------------------------------------------------- */
  113. /* Prototypes for the functions in the other modules            */
  114. /* -------------------------------------------------------------------- */
  115.  
  116. void FixPoint(double rmin, double rmax, double imin, double imax, double dx, double dy,
  117.         int maxiter, double divergenz, int gx, int gy, int depth);
  118. void __regargs    Apfel_Alert(long number);
  119. void __regargs    Activate_Gadget(struct Window *w, USHORT ID);
  120. void __regargs    Apfel_FLOAT(int x1, int y1, int x2, int y2);
  121. long         Iter_FLOAT(double r, double i);
  122.  
  123. /* --------------------------------------------------------------------- */
  124.  
  125. struct IntuitionBase    *IntuitionBase;
  126. struct GfxBase        *GfxBase;
  127. struct IFFBase        *IFFBase;
  128. struct ArpBase        *ArpBase;
  129. struct ColorBase    *ColorBase;
  130. struct Screen        *s;
  131. struct Window        *w, *u, *v;
  132. struct RastPort        *rp, *up;
  133. struct ViewPort        *vp;
  134. short             cycle, task = TRUE;
  135. APTR             IFFfile = NULL;
  136. struct FileRequester    *FReq;
  137. union printerIO        *request;
  138. struct MsgPort        *printerPort;
  139.  
  140. int             gx, gy, xsize, ysize, depth, hide;
  141. short             maxcol;
  142. int             maxiter;
  143. double             divergenz, rmin, rmax, imin, imax, dx, dy;
  144.  
  145. /* -------------------------------------------------------------------- */
  146. /* All the stuff needed to comfortably get IntuitionMessages        */
  147. /* -------------------------------------------------------------------- */
  148.  
  149. #define GAD_ID (((struct Gadget *)ADDR)->GadgetID)
  150.  
  151. ULONG             CLASS, CODE;
  152. APTR             ADDR;
  153. struct IntuiMessage    *Message    = NULL;
  154.  
  155. ULONG GetMessage(struct Window *MW)
  156. {
  157.     CLASS = CODE = 0;
  158.     ADDR = NULL;
  159.     if ( Message = (struct IntuiMessage *) GetMsg(MW->UserPort) ) {
  160.         CLASS    = Message->Class;
  161.         CODE    = Message->Code;
  162.         ADDR    = Message->IAddress;
  163.         ReplyMsg((struct Message *) Message);
  164.     }
  165.     return(CLASS);
  166. }
  167.  
  168. /* -------------------------------------------------------------------- */
  169. /* Simple routine to draw a rectangular shape. Used for the Mouse Opt    */
  170. /* -------------------------------------------------------------------- */
  171.  
  172. void DrawRect(struct RastPort *rp, short x1, short y1, short x2, short y2)
  173. {
  174.     Move(rp, x1, y1);
  175.     Draw(rp, x2, y1);
  176.     Draw(rp, x2, y2);
  177.     Draw(rp, x1, y2);
  178.     Draw(rp, x1, y1);
  179. }
  180.  
  181. /* -------------------------------------------------------------------- */
  182. /* Pre-initialized structures for main screen and window        */
  183. /* -------------------------------------------------------------------- */
  184.  
  185. struct NewScreen NS = {
  186.     0, 0,                /* screen XY origin relative to View */
  187.     0, 0,                /* screen width and height */
  188.     0,                /* screen depth (number of bitplanes) */
  189.     0, 1,                /* detail and block pens */
  190.     NULL,                /* display modes for this screen */
  191.     CUSTOMSCREEN | SCREENQUIET,    /* screen type */
  192.     NULL,                /* pointer to default screen font */
  193.     NULL,                /* screen title */
  194.     NULL,                /* first in list of custom screen gadgets */
  195.     NULL                /* pointer to custom BitMap structure */
  196. };
  197.  
  198. struct NewWindow NW = {
  199.     0, 0,        /* window XY origin relative to TopLeft of screen */
  200.     0, 0,        /* window width and height */
  201.     0, 1,        /* detail and block pens */
  202.     NULL,        /* IDCMP flags */
  203.     SMART_REFRESH |
  204.     ACTIVATE      |
  205.     BORDERLESS,    /* other window flags */
  206.     NULL,        /* first gadget in gadget list */
  207.     NULL,        /* custom CHECKMARK imagery */
  208.     NULL,        /* window title */
  209.     NULL,        /* custom screen pointer */
  210.     NULL,        /* custom bitmap */
  211.     5, 5,        /* minimum width and height */
  212.     -1, -1,        /* maximum width and height */
  213.     CUSTOMSCREEN    /* destination screen type */
  214. };
  215.  
  216. /* -------------------------------------------------------------------- */
  217. /* Default palette. Change this if you don't like the colors provided    */
  218. /* by me. Versions 25 and higher are supporting a custom default file.    */
  219. /* -------------------------------------------------------------------- */
  220.  
  221. USHORT Palette[128] = {
  222.     0x0000,    /* color #0 */
  223.     0x0F90,    /* color #1 */
  224.     0x0F20,    /* color #2 */
  225.     0x0840,    /* color #3 */
  226.     0x0580,    /* color #4 */
  227.     0x0589,    /* color #5 */
  228.     0x055F,    /* color #6 */
  229.     0x0A0F,    /* color #7 */
  230.     0x0F08,    /* color #8 */
  231.     0x0777,    /* color #9 */
  232.     0x0080,    /* color #10 */
  233.     0x00A0,    /* color #11 */
  234.     0x00C0,    /* color #12 */
  235.     0x00E0,    /* color #13 */
  236.     0x08E0,    /* color #14 */
  237.     0x0FF0,    /* color #15 */
  238.     0x0000,    /* color #16 */
  239.     0x0F90,    /* color #17 */
  240.     0x0F20,    /* color #18 */
  241.     0x0840,    /* color #19 */
  242.     0x0580,    /*